package cn.gorit.content.service.impl;

import cn.gorit.common.enums.ResultEnums;
import cn.gorit.common.enums.StateEnums;
import cn.gorit.common.exception.BlogException;
import cn.gorit.common.lang.Result;
import cn.gorit.content.service.AboutService;
import cn.gorit.entity.content.About;
import cn.gorit.mapper.content.AboutMapper;
import cn.gorit.utils.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @version v1.0
 * @Classname AboutService
 * @Description TODO
 * @Author CodingGorit
 * @Created on 2021/3/31
 * @IDLE IntelliJ IDEA
 **/
@Service
public class AboutServiceImpl implements AboutService {

    @Autowired
    AboutMapper mapper;
    /**
     * 保存
     * @param about
     */
    @Override
    public void save(About about) {
        mapper.save(about);
    }

    /**
     * 更新
     *
     * @param about
     */
    @Override
    public void update(About about) {
        mapper.updateAbout(about);
    }

    /**
     * 根据id查询
     *
     * @param id
     * @return
     */
    @Override
    public About getById(Integer id) {
        return mapper.getAboutById(id);
    }

    /**
     * 根据id删除
     * @param id
     */
    @Override
    public void deleteById(Integer id) {
        mapper.deleteAboutById(id);
    }

    /**
     * 根据id启用 或者禁用
     * 至少保证一个存在，不能同时启用两个
     * @param id
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result<Object> enableById(Integer id,Integer enable) {
        // 查询是否存在已经启用的 关于我的，如果有，但是开启的是其他的，则会抛出异常
        if (enable.equals(1)) // 启用
            mapper.updateEnable(StateEnums.ENABLED.getCode(),id);
        if (enable.equals(0)) // 禁用
            mapper.updateEnable(StateEnums.DISABLE.getCode(),id);
        About about = mapper.getAbout();
        if (about == null) {
            throw new BlogException(ResultEnums.ERROR.getCode(),"只能启用一个或者至少得保有一个关于");
        }
        return new Result<>(ResultEnums.UPDATE_SUCCESS.getCode(),ResultEnums.UPDATE_SUCCESS.getMsg());
    }

    /**
     * 分页查询 OK
     * @param page
     * @return
     */
    @Override
    public Page<About> getByPage(Page<About> page) {
        // 查询数据
        List<About> aboutlist = mapper.getByPage(page);
        page.setList(aboutlist);
        // 查询总数
        int totalCount = mapper.getCountByPage(page);
        page.setTotalCount(totalCount);
        return page;
    }

    /**
     * 阅读
     *
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result<About> read() {
        About about = mapper.getAbout();
        if (about == null) {
            throw new BlogException("关于我的不存在");
        }
        // 更新阅读数
        mapper.updateReadAbout(about.getAboutId());
        return new Result<>("查询成功", about);
    }
}
